import { ConfigService } from '@nestjs/config';
import {
  ExtractJwt,
  Strategy,
  StrategyOptionsWithoutRequest,
} from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
// import { jwtConstants } from './constants';
import { ConfigEnum } from '@/common/enum/config.enum';

/**
 * JWT策略(还可以设置其他 local策略、a策略、b策略等)
 * 如果不用这个，也可以正常鉴权，但是nestjs会自动从固定请求头Authorization中提取JWT，并校验，无法设置
 */
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  // protected 受保护的，configService只能在当前方法使用
  constructor(protected configService: ConfigService) {
    // 调用父类的构造函数，传入一个对象，该对象包含jwtFromRequest、ignoreExpiration和secretOrKey三个属性
    super({
      // 从请求头中提取JWT
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      // 不忽略过期时间
      ignoreExpiration: false,
      // 从配置服务中获取JWT的密钥
      secretOrKey: configService.get<string>(ConfigEnum.JWT_SECRET),
    } as StrategyOptionsWithoutRequest);
  }

  validate(payload: object) {
    // 校验通过后取得jwt信息
    return { ...payload }; // 控制器中通过@Req req 的 req.user获取
  }
}
